package com.jqq.inner_;

/**
 * 演示匿名内部类的使用
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
//        Tiger tiger = new Tiger();
//        tiger.cry();
//        Dog dog = new Dog();
//        dog.cry();
        Outer04 outer04 = new Outer04();
        outer04.method();
    }
}
class Outer04{//外部类
    private int n1 = 10;
    public void method(){
        //基于接口的匿名内部类
        //1.想使用接口IA，并创建对象
        //2.传统方式是写一个类class，implements实现该接口，并创建对象
        // 比如创建Tiger、Dog类实现IA接口的不同的cry方法 需求是Tiger/Dog类只使用一次，后面不再使用
        //所以可以使用匿名内部类来简化开发
        //tiger的编译类型是IA tiger的运行是匿名内部类 xxxx=>外部类的名称$1
        /*
            在底层会分配一个类名Outer04$1
            class xxxx implements IA{
                @Override
                public void cry() {
                    System.out.println("老虎叫唤。。");
                }
            }
         */
        //jdk底层在创建匿名内部类Outer04$1,立即马上就创建了Outer04$1实例，并且把地址返回给tiger
        //匿名内部类使用一次，就不能再使用 但是基于这个匿名内部类所创建的对象可以反复调用几次
        IA tiger = new IA(){
            @Override
            public void cry() {
                System.out.println("老虎叫唤。。");
            }
        };
        System.out.println("tiger的运行类型="+tiger.getClass());
        tiger.cry();
        tiger.cry();
        tiger.cry();

        //演示基于类的匿名内部类
        //1.father编译类型 Father
        //2.father运行类型-》匿名类 Outer04$2
        /*
            class Outer04$2 extends Father{
            }
         */
        Father father = new Father("jack"){
            @Override
            public void test() {
                super.test();
            }
        };
        father.test();
        System.out.println("father的运行类型="+father.getClass());
        Animal dog = new Animal(){

            @Override
            void eat() {
                System.out.println("小狗吃骨头");
            }

            @Override
            void say() {
                super.say();
            }
        };
        dog.eat();
        dog.say();
        System.out.println("dog运行类型="+dog.getClass());

    }
}
interface IA{//接口
    public void cry();
}
//class Tiger implements IA{
//    @Override
//    public void cry() {
//        System.out.println("老虎叫唤。。");
//    }
//}
//class Dog implements IA{
//    @Override
//    public void cry() {
//        System.out.println("小狗汪汪。。");
//    }
//}
class Father{//类
    public Father(String name){//构造器
    }
    public void test(){
        System.out.println("test..");
    }
}
abstract class Animal{
    abstract void eat();
    void say(){
        System.out.println("动物说话");
    };
}